///**
// * Copyright 2020 OPSLI 快速开发平台 https://www.opsli.com
// * <p>
// * Licensed under the Apache License, Version 2.0 (the "License"); you may not
// * use this file except in compliance with the License. You may obtain a copy of
// * the License at
// * <p>
// * http://www.apache.org/licenses/LICENSE-2.0
// * <p>
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// * License for the specific language governing permissions and limitations under
// * the License.
// */
//package org.opsli.core.autoconfigure.conf;
//
//import com.fasterxml.classmate.TypeResolver;
//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
//import com.google.common.collect.Lists;
//import io.swagger.annotations.ApiOperation;
//import org.opsli.core.autoconfigure.properties.GlobalProperties;
//import org.opsli.core.utils.UserTokenUtil;
//import org.springframework.beans.BeansException;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.config.BeanPostProcessor;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Import;
//import org.springframework.util.ReflectionUtils;
//import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
//import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
//import springfox.documentation.builders.ApiInfoBuilder;
//import springfox.documentation.builders.ParameterBuilder;
//import springfox.documentation.builders.PathSelectors;
//import springfox.documentation.builders.RequestHandlerSelectors;
//import springfox.documentation.schema.ModelRef;
//import springfox.documentation.service.*;
//import springfox.documentation.spi.DocumentationType;
//import springfox.documentation.spi.service.contexts.SecurityContext;
//import springfox.documentation.spring.web.plugins.Docket;
//import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
//import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
//import springfox.documentation.swagger2.annotations.EnableSwagger2;
//
//import jakarta.annotation.Resource;
//import java.lang.reflect.Field;
//import java.util.List;
//import java.util.stream.Collectors;
//
///**
// * Swagger 配置类
// *
// * @author Pace
// * @date 2020-09-15
// */
//@Configuration
//@EnableSwagger2
//@EnableKnife4j
//@Import(BeanValidatorPluginsConfiguration.class)
//public class SwaggerConfig {
//
//    /** 配置类 */
//    @Resource
//    private GlobalProperties globalProperties;
//
//    private final TypeResolver typeResolver;
//
//    @Autowired
//    public SwaggerConfig(TypeResolver typeResolver) {
//        this.typeResolver = typeResolver;
//    }
//
//    // ========================= Swagger =========================
//
//    /**
//     * swagger2的配置文件，这里可以配置swagger2的一些基本的内容，比如扫描的包等等
//     *
//     * @return Docket
//     */
//    @Bean
//    public Docket createRestApi() {
//        return new Docket(DocumentationType.SWAGGER_2)
//                .apiInfo(apiInfo())
//                .groupName("opsli 2.X")
//                .select()
//                //此包路径下的类，才生成接口文档
//                .apis(RequestHandlerSelectors.basePackage("org.opsli"))
//                //加了ApiOperation注解的类，才生成接口文档
//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//                .paths(PathSelectors.any())
//                .build()
//                .securityContexts(Lists.newArrayList(securityContext()))
//                .securitySchemes(Lists.<SecurityScheme>newArrayList(apiKey()));
//
//    }
//
//
//    /**
//     * api文档的详细信息函数,注意这里的注解引用的是哪个
//     *
//     * @return ApiInfo
//     */
//    private ApiInfo apiInfo() {
//        return new ApiInfoBuilder()
//                // //大标题
//                .title(globalProperties.getSystemName() + " 服务API接口文档")
//                // 版本号
//                .version("1.0")
//                // 描述
//                .description("后台API接口")
//                // 作者
//                .contact(new Contact("Parker", "https://opsli.com", "meet.parker@foxmail.com"))
//                .license("The Apache License, Version 2.0")
//                .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
//                .build();
//    }
//
//
//    /**
//     * 安全模块
//     * @return SecurityContext
//     */
//    private SecurityContext securityContext() {
//        return SecurityContext.builder()
//                .securityReferences(defaultAuth())
//                .forPaths(PathSelectors.regex("/.*"))
//                .build();
//    }
//
//    /**
//     * jwt token
//     * @return List
//     */
//    private List<Parameter> defaultToken() {
//        ParameterBuilder parameterBuilder = new ParameterBuilder();
//        List<Parameter> parameters= Lists.newArrayList();
//        parameterBuilder.name(UserTokenUtil.TOKEN_NAME)
//                .description("Token 令牌")
//                .modelRef(new ModelRef("String"))
//                .parameterType("header")
//                .required(false).build();
//        parameters.add(parameterBuilder.build());
//        return parameters;
//    }
//
//    /**
//     * oauth2 授权
//     * @return List
//     */
//    List<SecurityReference> defaultAuth() {
//        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
//        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
//        authorizationScopes[0] = authorizationScope;
//        return Lists.newArrayList(new SecurityReference(UserTokenUtil.TOKEN_NAME, authorizationScopes));
//    }
//
//    private ApiKey apiKey() {
//        return new ApiKey(UserTokenUtil.TOKEN_NAME, UserTokenUtil.TOKEN_NAME, "header");
//    }
//
//    /**
//     * 解决springboot2.6 和springfox不兼容问题
//     * @return
//     */
//    @Bean
//    public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
//        return new BeanPostProcessor() {
//
//            @Override
//            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//                if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
//                    customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
//                }
//                return bean;
//            }
//
//            private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
//                List<T> copy = mappings.stream()
//                        .filter(mapping -> mapping.getPatternParser() == null)
//                        .collect(Collectors.toList());
//                mappings.clear();
//                mappings.addAll(copy);
//            }
//
//            @SuppressWarnings("unchecked")
//            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
//                try {
//                    Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
//                    field.setAccessible(true);
//                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
//                } catch (IllegalArgumentException | IllegalAccessException e) {
//                    throw new IllegalStateException(e);
//                }
//            }
//        };
//    }
//
//}
